package com.mingqi.hw.test91100;

/**
 * 给定一个正整型数组表示待系统执行的任务列表，数组的每一个元素代表一个任务，元素的值表示该任务的类型。请计算执行完所有任务所需的最短时间。任务执行规则如下：
 * 1、任务可以按任意顺序执行，且每个任务执行耗时间均为1个时间单位。
 * 2、两个同类型的任务之间必须有长度为N个单位的冷却时间，比如：N为2时，在时间K执行了类型3的任务，那么K+1和K+2两个时间不能执行类型3任务。
 * 3、系统在任何一个单位时间内都可以执行一个任务，或者等待状态。
 * 说明：数组最大长度为1000,数组最大值1000.
 * 输入描述:
 * 第一行记录一个用半角逗号分隔的数组，数组长度不超过1000，数组元素的值不超过1000
 * 第二行记录任务冷却时间，N为正整数，N<=100。
 * 输出描述:
 * 输出为执行完所有任务所需的最短时间。
 * 示例1
 * 输入
 * 2,2,2,3
 * 2
 * 输出
 * 7
 * 说明
 * 时间1：执行类型2任务。
 * 时间2：执行类型3的任务（因为冷却时间为2，所以时间2不能执行类型2的任务）。
 * 时间3：系统等待（仍然在类型2的冷却时间）。
 * 时间4：执行类型2任务。
 * 时间5：系统等待。
 * 时间6：系统等待。
 * 时间7：执行类型2任务。
 * 因此总共耗时7
 */
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class ZT99 {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String[] tasksStr = scanner.nextLine().split(",");
        int cooldown = scanner.nextInt();
        scanner.close();

        int[] tasks = new int[tasksStr.length];
        for (int i = 0; i < tasksStr.length; i++) {
            tasks[i] = Integer.parseInt(tasksStr[i]);
        }

        int minTime = calculateMinimumTime(tasks, cooldown);
        System.out.println(minTime);
    }

    private static int calculateMinimumTime(int[] tasks, int cooldown) {
        Map<Integer, Integer> lastExecution = new HashMap<>();
        int currentTime = 0;

        for (int task : tasks) {
            int waitTime = 0;
            if (lastExecution.containsKey(task)) {
                // 如果已经执行过该类型任务，计算需要等待的时间
                waitTime = Math.max(0, lastExecution.get(task) + cooldown - currentTime);
            }
            // 更新当前时间
            currentTime += 1 + waitTime;
            // 更新该类型任务的最后执行时间
            lastExecution.put(task, currentTime);
        }

        return currentTime;
    }
}
